package com.atguigu.gmall.order.service;

import com.atguigu.gmall.enums.model.ProcessStatus;
import com.atguigu.gmall.order.model.OrderInfo;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;

import java.util.Map;

/**
 * 订单表 订单表 业务接口类
 *
 * @author atguigu
 * @since 2023-09-15
 */
public interface OrderInfoService extends IService<OrderInfo> {

    /**
     * 获取当前登录用户订单确认页相关数据汇总
     *
     * @return
     */
    Map<String, Object> orderTradeData(String userId);

    /**
     * 提交商城订单
     *
     * @param orderInfo
     * @param tradeNo
     * @return
     */
    Long submitOrder(OrderInfo orderInfo, String tradeNo);

    /**
     * 保存订单及订单明细
     *
     * @param orderInfo
     * @param orderType 订单类型 1：商城订单 2：秒杀订单
     * @return
     */
    Long saveOrderInfo(OrderInfo orderInfo, String orderType);


    /**
     * 生成流水号
     *
     * @param userId
     * @return
     */
    String generateTradeNo(String userId);


    /**
     * 验证流水号是否一致
     *
     * @param userId
     * @param tradeNo
     * @return
     */
    Boolean checkTradeNo(String userId, String tradeNo);


    /**
     * 删除业务流水号
     *
     * @param userId
     */
    void deleteTradeNo(String userId);


    /**
     * 验证商品库存
     *
     * @param skuId
     * @param skuNum
     * @return
     */
    boolean checkSkuStock(Long skuId, Integer skuNum);

    /**
     * 分页查询指定用户订单列表（包含订单中订单明细）
     *
     * @param infoPage
     * @param userId
     * @return
     */
    Page<OrderInfo> getOrderByPage(Page<OrderInfo> infoPage, String userId);

    /**
     * 验证订单支付状态且关闭订单
     *
     * @param orderId
     */
    void execCloseOrder(Long orderId);


    /**
     * 将指定订单改为指定状态
     *
     * @param orderId
     */
    void updateOrderStatus(Long orderId, ProcessStatus processStatus);

    /**
     * 根据订单ID查询订单及订单明细
     * @param orderId
     * @return
     */
    OrderInfo getOrderInfo(Long orderId);

    /**
     * 处理订单支付成功->修改订单状态，发送消息通知库存锁定库存
     * @param orderId
     */
    void processPaySucess(Long orderId);

    /**
     * 处理库存扣减结果-根据结果更新订单状态
     * @param stockDeductStr
     */
    void processStockDeductResult(String stockDeductStr);

    /**
     * 订单拆分处理
     * @param orderId
     * @param wareSkuMap
     * @return
     */
    String orderSplit(Long orderId, String wareSkuMap);

    /**
     * 保存秒杀订单
     * @param orderInfo
     * @return
     */
    Long submitSeckillOrder(OrderInfo orderInfo);
}
